//
// Created by pzw on 23-12-29.
//

#include "cantest.h"
#include "./so/ECanVci.h"

#include <iostream>
#include <cstring>
#include <sstream>

//接口卡类型定义
#define USBCAN1 3
#define USBCAN2 4
//函数调用返回状态值
#define STATUS_OK 1
#define STATUS_ERR 0

//通道号 @{
#define CAN1 0
#define CAN2 1
// @}

static DWORD DeviceType = USBCAN2; //设备类型 USBCAN2 双通道
static DWORD DeviceInd = 0; //设备索引 0，只有一个 USBCAN

int cantest_main(int argc, char *argv[]) {
    if (OpenDevice(DeviceType, DeviceInd, 0) != STATUS_OK) {
        std::cout << "打开设备失败" << std::endl;
        return 0;
    }
    std::cout << "打开设备成功" << std::endl;


    INIT_CONFIG init_config;
    memset(&init_config, 0, sizeof(init_config));
    init_config.AccCode = 0;
    init_config.AccMask = 0xffffff;//不滤波
    init_config.Filter = 0;
    init_config.Timing0 = 0x00; //波特率500k
    init_config.Timing1 = 0x1c; //波特率 500k
    init_config.Mode = 0; //正常模式
    if (InitCAN(DeviceType, DeviceInd, CAN1, &init_config) != STATUS_OK) {
        std::cout << "初始化通道失败" << std::endl;
        CloseDevice(DeviceType, DeviceInd);
        return 0;
    }
    std::cout << "初始化CAN1通道成功: "
              << "波特率 = " << init_config.Timing0
              << ", 模式 = " << static_cast<int>(init_config.Mode) << std::endl;


    if (StartCAN(DeviceType, DeviceInd, CAN1) != STATUS_OK) {
        std::cout << "打开CAN1通道失败" << std::endl;
        CloseDevice(DeviceType, DeviceInd);
        return 0;
    }
    std::cout << "打开CAN1通道成功: "
              << "波特率 = " << init_config.Timing0
              << ", 模式 = " << static_cast<int>(init_config.Mode) << std::endl;


    if (InitCAN(DeviceType, DeviceInd, CAN2, &init_config) != STATUS_OK) {
        std::cout << "初始化CAN2通道失败" << std::endl;
        CloseDevice(DeviceType, DeviceInd);
        return 0;
    }
    std::cout << "初始化CAN2通道成功: "
              << "波特率 = " << init_config.Timing1
              << ", 模式 = " << static_cast<int>(init_config.Mode) << std::endl;


    if (StartCAN(DeviceType, DeviceInd, CAN2) != STATUS_OK) {
        std::cout << "打开CAN2通道失败" << std::endl;
        CloseDevice(DeviceType, DeviceInd);
        return 0;
    }
    std::cout << "打开CAN2通道成功: "
              << "波特率 = " << init_config.Timing1
              << ", 模式 = " << static_cast<int>(init_config.Mode) << std::endl;

    CAN_OBJ frame;
    memset(&frame, 0, sizeof(frame));
    frame.ID = 0x2b0;
    frame.DataLen = 8;
    // =0时为正常发送，=1时为单次发送（不自动重发），=2时为自发自收（用于测试CAN卡是否损坏），
    // =3时为单次自发自收（只发送一次，用于自测试），只在此帧为发送帧时有意义。
    frame.SendType = 0;
    // 是否是远程帧。=0时为数据帧，=1时为远程帧。
    frame.RemoteFlag = 0;
    // 是否是扩展帧。 =0时为标准帧（11位帧ID）， =1时为扩展帧（29位帧ID）。
    frame.ExternFlag = 0;
#if 0
    BYTE data[] = {
            (int) 0x00,
            (int) 0x00,
            (int) 0x08,
            (int) 0x08,
            (int) 0x08,
            (int) 0x08,
            (int) 0x08,
            (int) 0x08
    };
    memcpy(frame.Data, data, frame.DataLen);
#elif 1
    for (int i = 0; i < 8; i++) {
        if (i == 0) {
            frame.Data[i] = 0x20;
            continue;
        }
        frame.Data[i] = i;//数据
    }
#endif
    // 发送100次
    if (Transmit(DeviceType, DeviceInd, CAN1, &frame, 100) != STATUS_OK) {
        std::cout << "发送 ENGINE_STATUS 数据失败" << std::endl;
    }
    std::stringstream ss;
    for (int i = 0; i < 8; i++) {
        if (i > 0) {
            ss << ", ";
        }
        ss << std::hex << static_cast<int>(frame.Data[i]);
    }
    std::cout << "发送 ENGINE_STATUS 数据成功: "
              << "can_id = " << frame.ID << ", 长度 = " << static_cast<int>(frame.DataLen)
              << ", 数据载荷 = " << ss.str() << std::endl;

    memset(&frame, 0, sizeof(frame));
    frame.ID = 0x288;
    frame.DataLen = 8;
    // =0时为正常发送，=1时为单次发送（不自动重发），=2时为自发自收（用于测试CAN卡是否损坏），
    // =3时为单次自发自收（只发送一次，用于自测试），只在此帧为发送帧时有意义。
    frame.SendType = 0;
    // 是否是远程帧。=0时为数据帧，=1时为远程帧。
    frame.RemoteFlag = 0;
    // 是否是扩展帧。 =0时为标准帧（11位帧ID）， =1时为扩展帧（29位帧ID）。
    frame.ExternFlag = 0;
    for (int i = 0; i < 8; i++) {
        if (i == 5) {
            frame.Data[i] = 0x08;
            continue;
        }
        frame.Data[i] = i;//数据
    }
    if (Transmit(DeviceType, DeviceInd, CAN1, &frame, 100) <= 0) {
        std::cout << "发送 POWER_STATUS 数据失败" << std::endl;
        return 0;
    }
    std::cout << "发送 POWER_STATUS 数据成功: "
              << "can_id = " << frame.ID << ", 长度 = " << static_cast<int>(frame.DataLen)
              << ", 数据载荷 = " << ss.str() << std::endl;

    if (false) { // 是否关闭设备?
        CloseDevice(DeviceType, DeviceInd);
    }
    return STATUS_OK;
}